<!DOCTYPE HTML>
<html>
<!--
-->
<head>
  <title>Test that we reject syntax errors listed in property_database.js</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="property_database.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body onload="run()">
<p id="display"></p>
<iframe id="quirks" src="data:text/html,<div id='testnode'></div>"></iframe>
<div id="content" style="display: none">

<div id="testnode"></div>
  
</div>
<pre id="test">
<script class="testbody" type="text/javascript">

SimpleTest.requestLongerTimeout(2);
SimpleTest.waitForExplicitFinish();

function check_not_accepted(decl, property, info, badval)
{
  decl.setProperty(property, badval, "");

  is(decl.getPropertyValue(property), "",
     "invalid value '" + badval + "' not accepted for '" + property +
     "' property");

  if ("subproperties" in info) {
    for (var sidx in info.subproperties) {
      var subprop = info.subproperties[sidx];
      is(decl.getPropertyValue(subprop), "",
         "invalid value '" + badval + "' not accepted for '" + property +
         "' property when testing subproperty '" + subprop + "'");
    }
  }

  decl.removeProperty(property);
}

function check_value_balanced(decl, property, badval)
{
  var goodProp =
    (property == "background-color") ? "color" : "background-color";
  decl.cssText = goodProp + ": red; " + property + ": " + badval + "; " +
                 goodProp + ": green";
  is(decl.getPropertyValue(goodProp), "green",
     "invalid value '" + property + ": " + badval +
     "' is balanced and does not lead to parsing errors afterwards");
  decl.cssText = "";
}

function check_value_unbalanced(decl, property, badval)
{
  var goodProp =
    (property == "background-color") ? "color" : "background-color";
  decl.cssText = goodProp + ": green; " + property + ": " + badval + "; " +
                 goodProp + ": red";
  is(decl.getPropertyValue(goodProp), "green",
     "invalid value '" + property + ": " + badval +
     "' is unbalanced and absorbs what follows it");
  decl.cssText = "";
}

function check_empty_value_rejected(decl, emptyval, property)
{
  var goodProp =
    (property == "background-color") ? "color" : "background-color";
  decl.cssText = goodProp + ": red; " + property + ":" + emptyval + "; " +
                 goodProp + ": green";
  is(decl.length, 1,
     "empty value '" + property + ":" + emptyval +
     "' is not accepted");
  is(decl.getPropertyValue(goodProp), "green",
     "empty value '" + property + ":" + emptyval +
     "' is balanced and does not lead to parsing errors afterwards");
  decl.cssText = "";
}

function run()
{
  var gDeclaration = document.getElementById("testnode").style;
  var gQuirksDeclaration = document.getElementById("quirks").contentDocument
                             .getElementById("testnode").style;

  for (var property in gCSSProperties) {
    var info = gCSSProperties[property];

    check_empty_value_rejected(gDeclaration, "", property);
    check_empty_value_rejected(gDeclaration, " ", property);

    for (var idx in info.invalid_values) {
      check_not_accepted(gDeclaration, property, info,
                         info.invalid_values[idx]);
      check_not_accepted(gQuirksDeclaration, property, info,
                         info.invalid_values[idx]);
      check_value_balanced(gDeclaration, property,
                           info.invalid_values[idx]);
    }

    if ("quirks_values" in info) {
      for (var quirkval in info.quirks_values) {
        var standardval = info.quirks_values[quirkval];
        check_not_accepted(gDeclaration, property, info, quirkval);
        check_value_balanced(gDeclaration, property, quirkval);

        gQuirksDeclaration.setProperty(property, quirkval, "");
        gDeclaration.setProperty(property, standardval, "");
        var quirkret = gQuirksDeclaration.getPropertyValue(property);
        var standardret = gDeclaration.getPropertyValue(property);
        isnot(quirkret, "", property + ": " + quirkval +
                            " should be accepted in quirks mode");
        is(quirkret, standardret, property + ": " + quirkval + " result");

        if ("subproperties" in info) {
          for (var sidx in info.subproperties) {
            var subprop = info.subproperties[sidx];
            var quirksub = gQuirksDeclaration.getPropertyValue(subprop);
            var standardsub = gDeclaration.getPropertyValue(subprop);
            isnot(quirksub, "", property + ": " + quirkval +
                                " should be accepted in quirks mode" +
                                " when testing subproperty " + subprop);
            is(quirksub, standardsub, property + ": " + quirkval + " result" +
                                      " when testing subproperty " + subprop);
          }
        }

        gQuirksDeclaration.removeProperty(property);
        gDeclaration.removeProperty(property);
      }
    }

    for (var idx in info.unbalanced_values) {
      check_not_accepted(gDeclaration, property, info,
                         info.invalid_values[idx]);
      check_not_accepted(gQuirksDeclaration, property, info,
                         info.invalid_values[idx]);
      check_value_unbalanced(gDeclaration, property,
                             info.unbalanced_values[idx]);
    }
  }

  SimpleTest.finish();
}

</script>
</pre>
</body>
</html>
